/*
 * Copyright 2022 Rich yang, 18158898020@189.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */


// global marco defines for openrv core

`define RstEnable	1'b1		// reset sigal valid
`define RstDisable	1'b0		// reset signal invalid
`define ZeroWord	32'h00000000	// 32bit value of 0
`define WriteEnable	1'b1		// enable write
`define WriteDisable	1'b0		// disable write
`define ReadEnable	1'b1		// enable read
`define ReadDisable	1'b0		// disable read
`define AluOpBus	7:0		// translate stage output width of aluop_o
`define AluSelBus	2:0		// translate stage output width of alusel_o
`define InstValid	1'b0		// instruction valid
`define InstInvalid	1'b1		// instruction invalid
`define True_v		1'b1		// true value
`define False_v		1'b0		// false value
`define ChipEnable	1'b1		// chip enable
`define ChipDisable	1'b0		// chip disable


`define Stop		1'b1
`define NoStop		1'b0


// instructions of specific
// IMM_TYPE
`define XORI_FUNC3	3'b100		// xori func3
`define ORI_FUNC3	3'b110		// ori func3
`define ANDI_FUNC3	3'b111		// andi func3
`define SLLI_FUNC3	3'b001		// slli func3
`define SRXI_FUNC3	3'b101		// srli or srai func3
`define SRLI_FUNC7	7'b0000000	// srli func7
`define SRAI_FUNC7	7'b0100000	// srai func7
`define ADDI_FUNC3	3'b000		// addi func3
`define SLTI_FUNC3	3'b010		// slti func3
`define SLTIU_FUNC3	3'b011		// sltiu func3

// R_TYPE
`define XORDIV_FUNC3	3'b100		// xor div func3
`define XOR_FUNC7	7'b0000000	// xor func7
`define DIV_FUNC7	7'b0000001	// div func7
`define ORREM_FUNC3	3'b110		// or rem func3
`define OR_FUNC7	7'b0000000	// or func7
`define REM_FUNC7	7'b0000001	// rem func7
`define ANDREMU_FUNC3	3'b111		// and remu func3
`define AND_FUNC7	7'b0000000	// and func7
`define REMU_FUNC7	7'b0000001	// remu func7
`define SLLMULH_FUNC3	3'b001		// sll mulh func3
`define SLL_FUNC7	7'b0000000	// sll func7
`define MULH_FUNC7	7'b0000001	// mulh func7

`define SRXDIVU_FUNC3	3'b101		// srl or sra divu func3
`define SRL_FUNC7	7'b0000000	// srl func7
`define SRA_FUNC7	7'b0100000	// sra func7
`define DIVU_FUNC7	7'b0000001	// divu func7
`define ADDSUBMUL_FUNC3	3'b000		// add or sub op
`define ADD_FUNC7	7'b0000000	// add func7
`define SUB_FUNC7	7'b0100000	// sub func7
`define MUL_FUNC7	7'b0000001	// mul func7
`define SLTMULHSU_FUNC3	3'b010		// slt mulhsu func3
`define SLT_FUNC7	7'b0000000	// slt func7
`define MULHSU_FUNC7	7'b0000001	// mulhsu func7
`define SLTUMULHU_FUNC3	3'b011		// sltu mulhu func3
`define SLTU_FUNC7	7'b0000000	// slt func7
`define MULHU_FUNC7	7'b0000001	// mulhu func7
`define BEQ_FUNC3	3'b000		// BEQ func3
`define BNE_FUNC3	3'b001		// BNE func3
`define BLT_FUNC3	3'b100		// BLT func3
`define BGE_FUNC3	3'b101		// BGE func3
`define BLTU_FUNC3	3'b110		// BLTU func3
`define BGEU_FUNC3	3'b111		// BGEU func3
`define LB_FUNC3	3'b000		// LB func3
`define LH_FUNC3	3'b001		// LH func3
`define LW_FUNC3	3'b010		// LW func3
`define LBU_FUNC3	3'b100		// LBU func3
`define LHU_FUNC3	3'b101		// LHU func3
`define SB_FUNC3	3'b000		// SB func3
`define SH_FUNC3	3'b001		// SH func3
`define SW_FUNC3	3'b010		// SW func3

`define NOP_INST	32'h00000000

// U_TYPE
`define LUI_INST	7'b0110111	// LUI inst

`define EXE_NOP		7'b0000000	// nop opcode


`define INST_TYPE_I_LOAD	7'b0000011
`define INST_TYPE_I_IMM		7'b0010011
`define INST_TYPE_S		7'b0100011
`define INST_TYPE_R		7'b0110011
`define INST_TYPE_U		7'b0110111
`define INST_TYPE_SB		7'b1100111
`define INST_TYPE_UJ		7'b1101111
`define INST_JALR		7'b1100111
`define INST_AUIPC		7'b0010111
`define INST_TYPE_B		7'b1100011

// ALU op
`define EXE_AND_OP		8'b00000100
`define EXE_OR_OP		8'b00000101
`define EXE_XOR_OP		8'b00000110
`define EXE_NOP_OP		8'b00000000
`define EXE_SLL_OP		8'b00001000
`define EXE_SRL_OP		8'b00001001
`define EXE_SRA_OP		8'b00001010
`define EXE_ADD_OP		8'b00010000
`define EXE_SUB_OP		8'b00010001
`define EXE_SLT_OP		8'b00010010
`define EXE_SLTU_OP		8'b00010011
`define EXE_MUL_OP		8'b00010100
`define EXE_MULH_OP		8'b00010101
`define EXE_MULHU_OP		8'b00010110
`define EXE_MULHSU_OP		8'b00010111
`define EXE_DIV_OP		8'b00011000
`define EXE_DIVU_OP		8'b00011001
`define EXE_REM_OP		8'b00011010
`define EXE_REMU_OP		8'b00011011
`define EXE_JAL_OP		8'b00011100
`define EXE_JALR_OP		8'b00011101
`define EXE_AUIPC_OP		8'b00011110
`define EXE_BEQ_OP		8'b00100000
`define EXE_BNE_OP		8'b00100001
`define EXE_BLT_OP		8'b00100010
`define EXE_BGE_OP		8'b00100011
`define EXE_BLTU_OP		8'b00100100
`define EXE_BGEU_OP		8'b00100101
`define EXE_LB_OP		8'b00100110
`define EXE_LH_OP		8'b00100111
`define EXE_LW_OP		8'b00101000
`define EXE_LBU_OP		8'b00101001
`define EXE_LHU_OP		8'b00101010
`define EXE_SB_OP		8'b00101011
`define EXE_SH_OP		8'b00101100
`define EXE_SW_OP		8'b00101101

// ALU select
`define EXE_RES_LOGIC		4'b0001
`define EXE_RES_SHIFT		4'b0010
`define EXE_RES_NOP		4'b0000
`define EXE_RES_ARITHMETIC	4'b0100
`define EXE_RES_MUL		4'b0101
`define EXE_RES_DIV		4'b0110
`define EXE_RES_JUMP_BRANCH	4'b0111
`define EXE_RES_LOAD_STORE	4'b1000


`define NotBranch		1'b0
`define Branch			1'b1

// Macro defines of instruction memory ROM
`define InstAddrBus	31:0		// Address width of ROM
`define InstBus		31:0		// data width of ROM
`define InstMemNum	131072		// 128KB size of ROM
`define InstMemNumLog2	17


// Genrial register files defines
`define RegAddrBus	4:0		// width of Regfile address
`define RegBus		31:0		// width of Regfile data
`define RegWidth	32		// width of General Purpose register
`define DoubleRegWidth	64
`define DoubleRegBus	63:0
`define RegNum		32
`define RegNumLog2	5
`define NOPRegAddr	5'b00000
`define StallBus	5:0


// divided op
`define DivFree		2'b00
`define DivByZero	2'b01
`define DivOn		2'b10
`define DivEnd		2'b11
`define DivResultReady	1'b1
`define DivResultNotReady 1'b0
`define DivStart	1'b1
`define DivStop		1'b0

// data ram
`define DataAddrBus	31:0
`define DataBus		31:0
//`define DataMemNum	131072
`define DataMemNum	32
//`define DataMemNumLog2	17
`define DataMemNumLog2	5
`define ByteWidth	7:0

